/* 创建整个应用的路由器 */
// 1：引入createRouter
import { createRouter, createWebHashHistory } from 'vue-router';


// 2：引入可能要呈现的组件
import LoginView from '@admin/views/LoginView.vue';
import HomeView from '@admin/views/HomeView.vue';
import WelcomeView from '@admin/views/WelcomeView.vue';
import UserView from '@admin/views/user/UserView.vue';
import FileView from '../views/file/FileView.vue';
import AdminView from '../views/user/AdminView.vue';
import LogView from '../views/syslog/log.vue';
// 3：定义路由规则
const routes = [
  { path: '/', redirect: '/login' },
  { path: '/login', name: 'Login', component: LoginView },
  {
    path: '/home',
    component: HomeView,
    redirect: '/welcome',
    children: [
      { path: '/welcome', component: WelcomeView },
      { path: '/user', component: UserView },
      { path: '/fileView', component: FileView},
      {path: '/adminView', component: AdminView},
      {path: '/system/log', component: LogView}
    ],
  },
];

// 4：创建路由器
const router = createRouter({
  history: createWebHashHistory(), //路由器的工作模式
  routes: routes,
});
// 用于解码 Base64Url 编码的部分
function base64UrlDecode(base64Url) {
  let base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
  let decoded = atob(base64);
  return decoded;
}

// 解析 JWT token 并返回 payload
function parseJwt(token) {
  const parts = token.split('.');
  if (parts.length !== 3) {
      throw new Error('Invalid token format');
  }
  const payload = base64UrlDecode(parts[1]);
  return JSON.parse(payload);
}
function isTokenExpired(token) {
  try {
      const decoded = parseJwt(token);
      const currentTime = Math.floor(Date.now() / 1000); // 当前时间戳，单位是秒
      const expTime = decoded.exp; // JWT 中的过期时间（单位是秒）

      // 如果当前时间大于 token 的过期时间，则 token 已过期
      return expTime < currentTime;
  } catch (e) {
      console.error('Token 解析失败:', e);
      return true; // 如果解析失败，认为 token 无效
  }
}

// 5：全局前置守卫，权限拦截
router.beforeEach((to, from) => {
  // 如果没有token，而且访问的不是登录页面，将用户重定向到登录页面
  if (!localStorage.getItem('admin-token') && to.name !== 'Login') {
    return { name: 'Login' };
  }
  //验证token是否过期
  if (isTokenExpired(localStorage.getItem('admin-token')) && to.name !== 'Login' ) {
    console.log('Token 已过期');
    return { name: 'Login' };
  }
  return true;
});

// 6：暴露出去router
export default router;
